package Demo11;

//抽象类:如果一个类没有包含足够的信息来描述一个具体的对象

//抽象类和普通类的区别--》抽象类不能被实例化,抽象类可以包含非抽象方法和抽象方法
//但是普通类必须不能包含抽象方法
//子类和父类的返回值类型是继承关系（协变类型==返回值类型是父子关系）
// ==这样子也可以发生重写，这样子也可以看成是同一个类
public class Test {
    public static void main(String[] args) {
//        Shape shape = new Shape();


    }

}
//抽象类定义
abstract class Shape {
//    public void draw() {
//        System.out.println("画图形");
//    }
    public abstract void draw();

    public void draw1() {
        System.out.println();
    }
}

class Rect extends Shape {

    @Override
    public void draw() {
        System.out.println("画矩形");
    }
}

class Cycle extends Shape {

    @Override
    public void draw() {
        System.out.println("画⚪");
    }

    public void drawMap(Shape shape) {
        shape.draw();
    }

    public static void main(String[] args) {
        Cycle cycle = new Cycle();
        cycle.drawMap(cycle);
    }
}


//抽象类使用abstract修饰，不能被实例化，可以被继承。
//类中的方法可以不实现，但是必须用abstract修饰
//在抽象类中，可以有抽象方法和非抽象方法
//一个方法被abstra修饰，没有具体的实现--》抽象方法
//包含抽象方法的类必须是抽象类，但是抽象类不一定有抽象方法
//抽象类就是用来被继承
//继承抽象类的类必须重写抽象类的抽象方法
//抽象类存在的最大意义1就是为了被继承。
//抽象方法不能是private，final，static修饰，一定要满足重写的规则
//抽象类必须被继承，而且子类必须重写父类的抽象方法
//如果子类不想重写父类的抽象方法，则子类必须被abstract修饰
//抽象类当中不一定包含抽象方法
//抽象类中可以有构造方法，用来初始化父类成员变量

//使用抽象类相当于多了一层编译器的校验
//很多语法存在的意义是为了预防出错